import _ from 'lodash'
import VUE from 'vue'
import { mapState } from 'vuex'
import { checkUrl } from '@/app-config'
import components from './components'
import directives from './directives'
import filters from './filters'
import storage from './storage'

//  yidu-ui锁定了element的版本2.5.1，无el-empty，这里拷贝了一份
import empty from '../components/empty'

import {
    formatSplitBit
} from './utils'

VUE.use(empty)

// eventBus
const EVENTBUS = new VUE({})

window.EVENTBUS = EVENTBUS

/**
 * @description 在vue.$on上的二次封装，会在vue组件销毁时自动解绑
 * @param  {string} name
 * @param  {function} func
 * @param  {object} context vue实例
 */
function onVue(name, function_, context) {
    EVENTBUS.$on(name, function_)
    if (context && _.isFunction(context.$once)) {
        context.$once('hook:beforeDestroy', () => {
            window.EVENTBUS.$off(name, function_)
        })
    }
}

Object.defineProperties(EVENTBUS, {
    $onVue: {
        get() {
            return onVue
        },
    },
})

const install = function install(Vue) {
    Object.defineProperties(Vue.prototype, {
        // 属性
        $baseUrl: {
            // 对应vue.config.js 中的 publicPath 选项，即应用会部署的基础路径。
            get() {
                return process.env.BASE_URL
            },
        },
        // 方法
        _get: {
            get() {
                return _.get
            },
        },
        formatSplitBit: {
            get() {
                return formatSplitBit
            },
        },
        // 实例
        $storage: {
            // 挂载storage
            get() {
                return storage
            },
        },
    })
    // 组件
    Object.keys(components).forEach(key => {
        Vue.component(key, components[key])
    })
    // 指令
    Object.keys(directives).forEach(key => {
        Vue.directive(key, directives[key])
    })
    // 过滤器
    Object.keys(filters).forEach(key => {
        Vue.filter(key, filters[key])
    })
    // 3. 注入组件
    Vue.mixin({
        methods: {},
        computed: {
            ...mapState({
                activeEvents: state => state?.global?.activeEvents,
            }),
        },
    })
}

VUE.use({
    install,
})
